/*!
 * @file cmd.hh
 * @brief Wykonywanie poleceń konsoli/plików wykonywalnych
 */

#ifndef __ENGINE_CMD_HH
#define __ENGINE_CMD_HH

#include <string>
#include <sstream>
#include <list>
#include <fstream>

#include "engine/cmd/actionBase.hh"
#include "engine/cmd/actionInit.hh"
#include "engine/cmd/actionQuit.hh"
#include "engine/cmd/actionEcho.hh"
#include "engine/cmd/actionSet.hh"
#include "engine/cmd/actionInclude.hh"

class cmd{
public:

	/*!
	 * @brief Dodawanie komend na listę
	 * @return Zawsze true
	 */
	static bool start();

	/*!
	 * @brief Parsowanie komendy
	 * @param cmd_line Komenda do sparsowania
	 */
	static void execute(std::string line);

	/*!
	 * @brief Parsowanie pliku
	 * @param path Adres pliku
	 */
	static void executeFile(std::string path);

	/*!
	 * @brief Ustawianie aktywnego strumienia
	 * @param ss strumień do ustawienia
	 */
	static void setSStream(std::stringstream *ss);

	/*!
	 * @brief Dodaje nową komendę dla konsoli
	 * @param action nowa komenda
	 */
	static void addAction(actionBase *action);

private:

	/*!
	 * @brief Konstruktor uniemożliwiający tworzenie obiektów
	 * @return
	 */
	cmd();

	/*!
	 * @brief Aktywny strumień do którego lecą komunikaty
	 */
	static std::stringstream *activeSStream;

	/*!
	 * @brief Lista komend
	 */
	static std::list<actionBase*> *actionList;

	/*!
	 * @brief Wywołanie komendy [pełna analogia do int main(char *argv, int argc)]
	 * @param array Tablica stringów
	 * @param count Ilość stringów w tablicy
	 */
	static void callAction(std::string *array, int count);

	/*!
	 * @brief Śmieciowa zmienna. Podczas jej inicjalizacji wywoływana jest funkcja start()
	 */
	static bool initDone;

};

#else
class cmd;
#endif
